<?php

namespace app\api\business;

use app\common\lib\Str;
use app\common\lib\Time;
use app\common\model\User;

class UserBusiness
{
    protected $userModel = null;

    public function __construct()
    {
        $this->userModel = new User();
    }

    public function login($data)
    {
        // 手机号传递过来后跟存储在redis中的验证码进行验证
        $redisCode = cache(config('redis.mall_code_pre_' . $data['phone_number']));

        // 判断redisCode的值是否为存在以及是否跟用户写入的值相等
        if (empty($redisCode) || $redisCode != $data['code']) {
            # code...
            // throw new \think\Exception('不存在该验证码！');
        }

        /**
         * 如果存在则是判断数据库表中是否存在这个phone_number
         * 没有就创建，反之更新数据
         * */
        $user = $this->userModel->getUserByPhone($data['phone_number']);
        if (!$user) {
            # code...
            $userName = '214应援团' . $data['phone_number'];
            $data = [
                'username' => $userName,
                'phone_number' => $data['phone_number'],
                'type' => $data['type'],
                'status' => 1
            ];

            // 添加try catch这么做是防止数据库问题暴露给用户
            try {
                $this->userModel->save($data);
                $userId = $this->userModel->id;
            } catch (\Exception $e) {
                throw new \think\Exception('数据库内部异常');
            }
        } else {
            // 如果用户登录则登录用户信息
            try {
                $userId = $user->id;
                $userName = $user->username;
                $updata = [
                    'updata_time' => time(),
                    'operate_user' => $userName
                ];
                $this->userModel->upDataById($user->id, $updata);
            } catch (\Exception $e) {
                throw new \think\Exception('数据库内部异常！');
            }
        }

        // 获取token
        $token = Str::getLoginToken($data['phone_number']);
        // 记录redis信息
        $redisData = [
            'id' => $userId,
            'username' => $userName,
        ];

        // 存入token
        $redis = cache(config('redis.token_pre') . $token, $redisData, Time::userLoginExpiresTime($data['type']));

        /**
         * 判断redis是否存在，存在则将token信息返回给前端
         * 后续前端会根据会将这个token传过来进行请求，
         * 后端则根据这个token去redis中查询是否存在
         *  */
        return $redis ? ['token' => $token,'username' => $userName] : false;
    }

    // 通过id获取到用户基本数据
    public function getNormalUserById($id)
    {
        try {
            $result = $this->userModel->getUserById($id);
        } catch (\Exception $e) {
            throw new \think\Exception('数据库内部异常！');
        }

        if (!$result || $result->status != 1) {
            # code...
            return [];
        }

        return $result;
    }

    // 通过用户名查找用户
    public function getNormalUserByUserName($username)
    {
        $Result = $this->userModel->getUserByusername($username);
        if (!$Result || $Result->status != 1) {
            # code...
            return [];
        }
        return $Result;
    }

    // 更新用户信息
    public function update($id, $data)
    {
        // 通过id判断用户是否存在
        $user = $this->getNormalUserById($id);
        if (!$user) {
            new \think\Exception('该用户不存在！');
        }

        // 检查该用户名是否重复
        $userRestult = $this->getNormalUserByUserName($data['username']);
        if ($userRestult && $userRestult->id != $id) {
            # code...
            throw new \think\Exception('该用户存在请重新设置！');
        }

        // if ($data['rename'] == 1) {
        # code...
        // throw new \think\Exception('只能修改一次哦！');
        // } elseif ($data['rename'] == 0) {
        // 开始更新数据
        $updateResult = $this->userModel->upDataById($id, $data);
        if (!$updateResult) {
            throw new \think\Exception('更新数据失败！');
        };
        // }

        return $updateResult;
    }
}
